package com.naxia.seckill.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import javax.xml.ws.Service;
import java.sql.Types;

public class CodeGenerator {
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/seckill?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai",
                        "root",
                        "123456")
                .globalConfig(builder -> {
                    builder.author("Loosebraid") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .dateType(DateType.ONLY_DATE)
                            .outputDir(System.getProperty("user.dir") + "/src/main/java") // 指定输出目录
                            .disableOpenDir();
                })
                .dataSourceConfig(builder ->
                        builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                            int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                            if (typeCode == Types.SMALLINT) {
                                // 自定义类型转换
                                return DbColumnType.INTEGER;
                            }
                            return typeRegistry.getColumnType(metaInfo);
                        })
                )
                .packageConfig(builder ->
                        builder.parent("com.naxia.seckill") // 设置父包名
                                .entity("pojo") // 实体类包名
                                .mapper("mapper") // Mapper接口包名
                                .service("service") // Service类包名
                                .serviceImpl("service.impl")
                                .controller("controller") // Controller类包名
                                .xml("mapper.xml") // Mapper映射文件包名（默认在resources下）
                )
                .strategyConfig(builder ->
                        builder.addInclude("t_user")
                                .addTablePrefix("t_") // 忽略表名前缀（如t_book -> Book）
                                // 实体类策略配置
                                .entityBuilder()
                                .enableLombok() // 开启Lombok注解（@Data等）
                                .naming(NamingStrategy.underline_to_camel) // 表名下划线转驼峰
                                .columnNaming(NamingStrategy.underline_to_camel) // 列名下划线转驼峰
                                .logicDeleteColumnName("deleted") // 逻辑删除字段（如有）
                                // Controller策略配置
                                .controllerBuilder()
                                .enableRestStyle() // 开启REST风格（@RestController）
                )
                .templateConfig(builder -> {
                    builder.entity("/templates/entity.java") // 自定义实体类模板
                            .mapper("/templates/mapper.java") // 自定义Mapper模板
                            .service("/templates/service.java")
                            .controller("/templates/controller.java")
                            .xml("/templates/mapper.xml")
                            .serviceImpl("/templates/serviceImpl.java");
                })
                .execute();
    }
}
